/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.architexa.org.eclipse.gef.ui.parts;

import com.architexa.org.eclipse.gef.DefaultEditDomain;
import com.architexa.org.eclipse.gef.palette.PaletteRoot;
import com.architexa.org.eclipse.gef.ui.palette.PaletteViewer;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;


/**
 * This class serves as a quick starting point for clients who are new to GEF. It will
 * create an Editor containing a Split composite, with one side contianing a
 * PaletteViewer, and the other a GraphicalViewer.
 * <P>
 * <EM>IMPORTANT</EM>This class should only be used as a reference for creating your own
 * EditorPart implementation. This class will not suit everyone's needs, and may change in
 * the future. Clients may copy the implementation.
 * @author hudsonr
 */
public abstract class GraphicalEditorWithPalette 
	extends GraphicalEditor 
{

private static final int PALETTE_SIZE = 125;

private PaletteViewer paletteViewer;

/**
 * Called to configure the viewer before it receives its contents.
 */
protected void configurePaletteViewer() { }

/**
 * Creates the palette on the given composite.
 * @param parent the composite
 */
protected void createPaletteViewer(Composite parent) {
	PaletteViewer viewer = new PaletteViewer();
	setPaletteViewer(viewer);
	viewer.createControl(parent);
	configurePaletteViewer();
	hookPaletteViewer();
	initializePaletteViewer();
}

/**
 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
 */
public void createPartControl(Composite parent) {
	Splitter splitter = new Splitter(parent, SWT.HORIZONTAL);
	createPaletteViewer(splitter);
	createGraphicalViewer(splitter);
	splitter.maintainSize(getPaletteViewer().getControl());
	splitter.setFixedSize(getInitialPaletteSize());
	splitter.addFixedSizeChangeListener(new PropertyChangeListener() {
		public void propertyChange(PropertyChangeEvent evt) {
			handlePaletteResized(((Splitter)evt.getSource()).getFixedSize());
		}
	});
}

/**
 * Returns the PaletteRoot for the palette viewer.
 * @return the palette root
 */
protected abstract PaletteRoot getPaletteRoot();

/**
 * Returns the initial palette size in pixels. Subclasses may override this method to
 * return a persisted value.
 * @see #handlePaletteResized(int)
 * @return the initial size of the palette in pixels.
 */
protected int getInitialPaletteSize() {
	return PALETTE_SIZE;
}

/**
 * Returns the PaletteViewer.
 * @return the palette viewer
 */
protected PaletteViewer getPaletteViewer() {
	return paletteViewer;
}

/**
 * Called whenever the user resizes the palette.
 * @param newSize the new size in pixels
 */
protected void handlePaletteResized(int newSize) {
}

/**
 * Called when the palette viewer is set. By default, the EditDomain is given the palette
 * viewer.
 */
protected void hookPaletteViewer() {
	getEditDomain().setPaletteViewer(paletteViewer);
}

/**
 * Called to populate the palette viewer.
 */
protected void initializePaletteViewer() {
}

/**
 * Sets the palette viewer
 * @param paletteViewer the palette viewer
 */
protected void setPaletteViewer(PaletteViewer paletteViewer) {
	this.paletteViewer = paletteViewer;
}

/**
 * Sets the {@link #getPaletteRoot() palette root} of the edit domain
 * @see com.architexa.org.eclipse.gef.ui.parts.GraphicalEditor#setEditDomain(com.architexa.org.eclipse.gef.DefaultEditDomain)
 */
protected void setEditDomain(DefaultEditDomain ed) {
	super.setEditDomain(ed);
	getEditDomain().setPaletteRoot(getPaletteRoot());
}

}
